// 解析formData数据
var multer = require('multer')();
// 在路由里引入新建的表
var User = require('../Models/UserInfo');
var Post = require('../Models/post');


var mongoose = require('mongoose');
// 将字符串转回指定类型的id
var strtoObjectId = mongoose.Types.ObjectId;


module.exports = function (app) {
    // 权限控制中间件
    // app.use(中间件函数) ，就是用于添加中间件方法
    // 中间件的作用，就是过滤处理每一次请求
    // 中间件函数的参数
    // 参数一：上一个中间件，通过next方法传递的值。可选（如果上一个没传值，则可不写）
    // 参数二：请求体对象
    // 参数三：响应体对象
    // 参数四：表示中间件执行结束，将处理的数据传递到下一个中间件函数
    // 不写next()，则后续的中间件都不会执行
    // app.use(function (req, res, next) {
    //     console.log('每一次请求都执行');
    //     next('aaa');

    // });
    // app.use(function (prev, req, res, next) {
    //     console.log(prev);
    //     next();
    // });

    app.use(function (req, res, next) {
        // 判断要求：如果用户已登录，就不能再访问 get请求的/login和/register
        var username = req.session.username;
        // 获取各个请求的url
        var url = req.originalUrl;
        // console.log(url);

        if (username && (url === '/register' || url === '/login')) {
            // 将页面重定向到当前页（回退到本页面）
            res.redirect('back');
        }
        else {
            next();
        }


    });


    // 首页路由
    // 启动服务器就执行。
    app.get('/', function (req, res) {
        var user = req.session;
        // 在提交的post表格中查找数据
        Post.find({}, function (err, postsBefound) {
            console.log(postsBefound);
            if (err) {
                // 渲染views/index.html
                // 参数二：为渲染模板需要的数据
                res.render('index', {
                    error: true,
                    msg: '数据库查询文章列表错误'

                });
                return
            }
            res.render('index', {
                username: user.username,
                error: false,
                msg: '一切正常',
                postList: postsBefound.map(function (item) {
                    //直接访问数据库的 _id有双引号
                    // 用tostring方法对id处理
                    item.id = item._id.toString();
                    return item;
                })
            });


        });


    });

    // 请求页路由
    app.get('/register', function (req, res) {
        // render:渲染的是views/register.html
        res.render('register', {});

    });
    // 登录页路由
    app.get('/login', function (req, res) {
        res.render('login', {});

    });

    // 用户注册请求（Ajax请求）
    // 采用Ajax请求时，不需要刷新页面，只部分数据刷新。所以只需要返回数据即可
    app.post('/register', multer.array(), function (req, res) {
        // 整理数据
        var userToReg = {
            username: req.body.username,
            password: req.body.password
        }
        console.log(userToReg);
        // 先筛选是否重名
        // 参数一：查询条件（对象）
        // 参数二：回调函数
        // 回调函数的参数：
        // 参数一：错误对象。
        // 参数二：查询到的数据（对象）符合条件要求的第一条数据。
        // 若没有查询到。即没有重名。值为null
        User.findOne({ username: userToReg.username }, function (err, userBeFound) {
            //  先判断错误对象是否存在（处理数据库出错的情况）
            console.log(err);
            if (err) {
                res.send({
                    error: true,
                    msg: '数据库查询重名出错，请重试'

                });
                return
            };
            if (userBeFound) {
                res.send({
                    error: true,
                    msg: '该用户名已注册'

                });
                return
            };

            // 保存用户信息
            // 数据保存需要使用 实例对象保存，将保存的数据作为参数传递
            // save(错误对象||保存成功的数据)
            new User(userToReg).save(function (err, userBeSaved) {
                if (err) {
                    res.send({
                        error: true,
                        msg: '数据库保存用户名出错'

                    });
                    return

                }
                //将用户的信息存储到session对象中。
                req.session.username = userBeSaved.username;
                res.send({
                    error: false,
                    msg: '注册成功'

                });



            });


        });
    });


    //  用户登录请求（非Ajax）
    // 提交数据时，需要跳转新的页面，即请求的是一个页面数据。所以需要使用render 来渲染模板页面
    // 返回一个页面。处理页面请求
    app.post('/login', function (req, res) {
        // 整理用户登录信息
        var userToLogin = {
            username: req.body.username,
            password: req.body.password
        }
        console.log(userToLogin);
        // 查找是否已注册
        // 如果找到，则返回第一个找到的用户信息

        User.findOne({ username: userToLogin.username }, function (err, userBeFound) {
            if (err) {
                res.render('login', {
                    error: true,
                    msg: '数据库查询用户名出错'

                });
                return
            }
            if (!userBeFound) {
                res.render('login', {
                    error: true,
                    msg: '该用户名未注册'

                });
                return

            }
            if (userBeFound.password === userToLogin.password) {
                req.session.username = userBeFound.username;
                res.redirect('/');

            } else {
                res.render('login', {
                    error: true,
                    msg: '密码错误'

                });

            }




        });

    });

    // 用户退出请求
    app.get('/layout', function (req, res) {
        req.session.destroy();
        // 在服务器端在模板渲染的情况下控制页面跳转
        // redirect 重定向(302)
        res.redirect('/');

    });

    // -----------------

    // 访问用户详情页
    app.get('/user', function (req, res) {
        res.render('user', {
            username: req.session.username
        });


    });
    app.get('/edit', function (req, res) {
        res.render('edit', {
            username: req.session.username
        })

    });

    // 用户提交文章
    app.post('/publish', multer.array(), function (req, res) {
        // 整理用户数据
        var post = {
            title: req.body.title,
            post: req.body.post,
            username: req.session.username,
            // 毫秒数
            publishTime: new Date().getTime(),
        }
        // 保存用户提交的数据
        new Post(post).save(function (err, postSaved) {
            if (err) {
                res.render('edit', {
                    error: true,
                    msg: '数据库保存文章错误',
                    title: req.body.title,
                    post: req.body.post
                });
                return
            }
            res.redirect('/user');

        });


    });

    // 单独文章的路由
    app.get('/post', function (req, res) {
        var postId = req.query.postId;
        postId = strtoObjectId(postId);

        //   在数据库中查找相应文章信息
        Post.findById(postId, function (err, postsBefound) {
            console.log(postsBefound);
            res.render('post', {
                postDetail: postsBefound
            });

        });


    });





};